package hipoteca;

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class TablaAmortizacion {
	private Hipoteca hipoteca;
	@XmlElementWrapper(name="mensualidades")
	@XmlElement(name="mensualidad")
	private List<Mensualidad> mensualidades = null;
	
	public TablaAmortizacion() {
		super();
		hipoteca = null;
	}

	public TablaAmortizacion(double cantidad, double interes, int duracionAnyos) {
		hipoteca = new Hipoteca(cantidad, interes, duracionAnyos);
		calculaTablaAmortizacion();
	}

	private final void calculaTablaAmortizacion() {
		double capitalPendiente = hipoteca.getCantidad();
		double cuotaMensual = hipoteca.cuotaMensual();
		double interesPagado;
		double capitalAmortizado;
		mensualidades = new ArrayList<Mensualidad>();
		for (int i = 0; i < 12 * hipoteca.getDuracionAnyos(); i++) {
			interesPagado = calculaInteresPagado(capitalPendiente);
			capitalAmortizado = calculaCapitalAmortizado(cuotaMensual,
					interesPagado);
			capitalPendiente = calculaCapitalPendiente(capitalPendiente,
					capitalAmortizado);
			mensualidades.add(new Mensualidad(i + 1, interesPagado,
					capitalAmortizado, capitalPendiente));
		}
	}

	public String muestraTablaAmortizacion() {
		// if(mensualidades == null)
		// calculaTablaAmortizacion();
		StringBuffer sb = new StringBuffer();
		sb.append("Cuota mensual: "
				+ String.format("%.2f", hipoteca.cuotaMensual()) + "\n");
		sb.append("CUOTA\tINTERES\tPENDIENTE\tAMORTIZADO\n");
		for (Mensualidad mensualidad : mensualidades)
			sb.append(mensualidad.toString());
		return sb.toString();
	}

	private double calculaCapitalPendiente(double capitalPendiente,
			double capitalAmortizado) {
		return capitalPendiente - capitalAmortizado;
	}

	private double calculaCapitalAmortizado(double cuotaMensual,
			double interesPagado) {
		return calculaCapitalPendiente(cuotaMensual, interesPagado);
	}

	private double calculaInteresPagado(double capitalPendiente) {
		return capitalPendiente * hipoteca.getInteres() / 1200;
	}

	public double capitalPendiente(int mes) {
		mes--; // El indice del array empieza en 0 y los meses en 1.
		return mensualidades.get(mes).getCapitalPendiente();
	}

	public double interesPagado(int mes) {
		mes--;
		return mensualidades.get(mes).getInteresPagado();
	}

	public double capitalAmortizado(int mes) {
		mes--;
		return mensualidades.get(mes).getCapitalAmortizado();
	}
}
